﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpRenderingInterface.h"
#include "ElementId.h"
#include "RuntimeId.h"
#include <vector>
#include <map>

namespace gcmp
{
    /// \brief 遮挡退让管理器接口
    /// 注意：目前docID的主要作用是在运行时区别不同项目，而不是在同一项目中区别不同文档
    class GCMP_RENDERING_INTERFACE_EXPORT IHaloedGapManager
    {
    public:
        struct Info
        {
            enum Type
            {
                /// \brief 导线跟桥架2  机电水暖3不退让
                DEFAULT = 0, //其它  如 建筑、结构的构件等
                DAOXIAN = 1, //导线
                QIAOJIA = 2,  //桥架
                XIANXING_GOUJIAN = 3, //机电水暖的线性构件
                SHEBEI = 4, //机电设备                
            };

            Type _type = DEFAULT;
            bool _faceTakePartIn = false;
            std::set<ElementId> connected;
        };

        IHaloedGapManager();
        virtual ~IHaloedGapManager();

       virtual float GetExternalGap() const = 0;
       virtual  float GetInnerGap() const = 0;
       virtual bool IsClearHiddenLineEnable() const = 0;

       virtual void SetExternalGap(float gaps) = 0;
       virtual void SetInnerGap(float gaps) = 0;
       virtual void SetClearHiddenLineEnable(bool enable) = 0;
       
       /// \brief 设置内外间隙 最大值， 默认200像素
       virtual void SetMaxExternalGapPixel(float maxGaps) = 0;
       virtual void SetMaxInnerGapPixel(float maxGaps) = 0;
              
       /// \brief 增删改查
       /// 注意针对链接文档中的Element调用以下接口时，docID应使用当前项目主文档的ID,
       /// 并且不要使用链接文档中的原ElementID，而应使用主文档中的LinkElementProxy的ElementID
       static void AddInfo(const RuntimeId& docID, const ElementId& id, const Info& info);
       static void RemoveInfo(const RuntimeId& docID, const ElementId& id);
       static void UpdateInfo(const RuntimeId& docID, const ElementId& id, const Info& info);
       static bool FindInfo(const RuntimeId& docID, const ElementId& id, Info& outInfo);

       static void RemoveDocInfo(const RuntimeId& docID);       

       static const std::map<ElementId, Info>& GetDocElementInfo(const RuntimeId& docID);

       static const std::map<RuntimeId, std::map<ElementId, IHaloedGapManager::Info>>& GetAllElementInfo();

       static void RemoveAllInfo();
           
       /// \brief 这些info是发生变化, 内部使用，用于标记是否需要向显卡重新提交连接关系, 外部不需要赋值
       bool IsInfoDirty();
       void SetInfoDirty(bool dirty);

    private:
       bool m_isInfoDirty = true;
    };
}
